VS.NET2005已經將TreeView放入基本的元件,不過他的資料來源限定為XML檔案或者是Site Map,不過如果我們希望不同的使用者,依照不同的權限來瀏覽不同的網頁時,總不能每個使用者都訂立一個XML檔案來管理,於是小喵就開始尋找如何結合資料表的方式。
此外,當使用者進入系統後,如果每次瀏覽網頁都需要從資料庫撈取一次資料,並且組合一次Tree,小喵覺得似乎有點浪費資源,因此也順便透過Session機制,判斷如果沒有建立過Tree的話,就從資料庫撈資料建立TreeView,當在次瀏覽相關網頁時,如果判斷曾經建立過TreeView,就直接從Session中取回TreeView的結構並且直接顯示,這樣只需再配合一個小小的判斷最後變更權限的時間,來處理Session的存在與否,就能夠減少系統的資源浪費(重複建立撈取相同的TreeView結構)
樹狀結構的資料表設計:
要設計樹狀結構,希望能夠設計出無限層(無限深度)、無限項目的數,小喵的資料表欄位設計如下:
說明:
•NoteId:節點代號,自動編號
•ParnetId:父層結點代號
•sText:節點Text
•sValue:節點Value
•sURL:超鏈結網址
•sTarget:超鏈結Target
•Chger:資料修改者
•ChgTime:資料修改時間
ASP.NET前置作業:
接著開啟一個aspx檔案,並且再畫面上安排一個PlaceHolder控制項,然後在空白地方點兩下,開始撰寫PageOnLoad事件的相關程式
Imports
由於會存取資料庫,所以先將資料庫相關的命名空間Imports進來
Imports System.Data
Imports System.Data.SqlClient
編輯Page_Load事件
我們希望在Page_Load的時候,檢查一下是否曾經建立過TreeView,如果有,直接從Session取得TreeView,如果沒有→建立TreeView。
接著就是設定TreeView的ImageSet後,放入PlaceHolder中,相關程式碼如下:
Protected Sub Page_Load() Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'*****取得Tree物件*****
'利用Session 當Tree已經建立過,不重新建立,直接從Session中取得,加快速度
If Session("Tree1") Is Nothing Then
'Tree不曾建立過→呼叫建立TreeView程序
Call InitTree() '初始化Tree
Call BuildTree() '建立Tree內容
End If
'宣告Tree物件
Dim Tree1 As TreeView
'從Session中取得Tree物件
Tree1 = Session("Tree1")
'設定Tree的ImageSet
Tree1.ImageSet = TreeViewImageSet.XPFileExplorer
'置放於PlaceHolder
Me.PlaceHolder1.Controls.Add(Tree1)
End Sub
初始化TreeView:
在Page_Load中有呼叫初始化TreeView的Sub,接著就來看看初始化TreeView中做了哪些事情。由於一開始還沒有TreeView物件,所以先宣告並實體化TreeView,並且設定【根目錄】節點的相關內容,並指定他回首頁的超鏈結,這部份是靜態的,跟資料庫無關。最後把該Tree放入Session中。
Sub InitTree() InitTree()
'********初始化Tree********
'定義TreeView物件並實體化
Dim Tree1 As New TreeView
'定義一個TreeNode並實體化
Dim tmpNote As New TreeNode
'設定【根目錄】相關屬性內容
tmpNote.Text = "首頁"
tmpNote.Value = "0"
tmpNote.NavigateUrl = "PtestTreeView3.aspx"
tmpNote.Target = "_Top"
'Tree建立該Node
Tree1.Nodes.Add(tmpNote)
'將Tree存放入Session中
Session("Tree1") = Tree1
End Sub
建立樹狀結構程序:
在InitTree程序後,接著是要建立樹狀結構的程序。首先會檢查一下資料是否曾經取得過,如果沒有的話,呼叫取得資料的程序GetDataTable()。接著取得根目錄的節點,然後呼叫新增子節點的Function AddNodes並且傳入【根目錄】節點與根目錄的代號【0】
相關的程式如下:
Sub BuildTree() BuildTree()
'********建立樹狀結構********
'宣告TreeView
Dim Tree1 As TreeView
'如果Session中沒有Tree,初始化Tree
If Session("Tree1") Is Nothing Then
Call InitTree()
End If
Tree1 = Session("Tree1")
'取得根目錄節點
Dim RootNode As TreeNode
RootNode = Tree1.Nodes(0)
Dim rc As String
'呼叫建立子節點的函數
rc = AddNodes(RootNode, 0)
Session("Tree1") = Tree1
End Sub
取得資料的程序:
接著是取得資料,並且把DataTable放入Session的相關程式內容如下:
Sub GetDataTable() GetDataTable()
'取得DataTable
'宣告相關變數
Dim ConnStr As String
Dim Conn As SqlConnection
Dim Da As SqlDataAdapter
Dim Ds As DataSet
Dim dt As DataTable
Dim SqlTxt As String
Try
'設定連接字串,請修改符合您的資料來源的ConnectionString
ConnStr = "Data Source=Local\SQLEXPRESS;Persist Security Info=True;User ID=sa;Password=xxxxxxxxxxx;Initial Catalog=DTest"
'建立Connection
Conn = New SqlConnection(ConnStr)
Conn.Open()
'設定資料來源T-SQL
SqlTxt = "SELECT * FROM TTestTree" '請修改您的資料表名稱
'實體化DataAdapter並且取得資料
Da = New SqlDataAdapter(SqlTxt, Conn)
'實體化DataSet
Ds = New DataSet
'資料填入DataSet
Da.Fill(Ds)
'設定DataTable
dt = New DataTable
dt = Ds.Tables(0)
'將DataTable放入Session中
Session("Dt") = dt
'關閉連線
Conn.Close()
Catch ex As Exception
Me.lblMessage.Text = ex.Message
Finally
'資源回收
Ds = Nothing
Da = Nothing
Conn = Nothing
End Try
End Sub
由於字數限字,請參考Part2